package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.utils.JedisUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
@Slf4j
public class RoleController extends BaseController{

    @Autowired
    private RoleService roleService;

    // 记录日志的工具类
    //private Log log = LogFactory.getLog(RoleController.class);

    /**
     * 查询列表
     */
    @RequestMapping("/list")
    public String list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        log.info("执行用户分页的方法");

        // 企业id，从当前登陆用户哪里获取（先写死）
        String companyId = getLoginCompanyId();
        // 调用service查询
        PageInfo<Role> pageInfo =
                roleService.findByPage(companyId, pageNum, pageSize);
        // 存储查询结果
        request.setAttribute("pageInfo", pageInfo);

        return "system/role/role-list";
    }

    /**
     * 进入添加页面
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        return "system/role/role-add";
    }

    /**
     * 添加、修改
     */
    @RequestMapping("/edit")
    public String edit(Role role) {
        // 设置企业信息（先写死，后期从登陆用户动态获取）
        role.setCompanyId(getLoginCompanyId());
        role.setCompanyName(getLoginCompanyName());
        // 判断
        if (StringUtils.isEmpty(role.getId())) {
            log.info("添加用户....");
            roleService.save(role);
        } else {
            log.info("修改用户....");
            roleService.update(role);
        }
        return "redirect:/system/role/list";
    }

    /**
     * 进入修改页面
     * 1. 根据id查询，回显信息
     * 2. 查询所有，作为上级下拉列表
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        // 根据id查询
        Role role = roleService.findById(id);

        // 保存
        request.setAttribute("role", role);
        return "system/role/role-update";
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public String delete(String id) {
        log.info("执行角色删除.....");
        roleService.delete(id);
        return "redirect:/system/role/list";
    }

    /**
     * 角色分配权限（1）进入角色权限页面
     * 功能入口： role-list.jsp 点击 ·权限·
     * 请求地址： http://localhost:8080/system/role/roleModule.do?roleId="+id;
     * 请求参数： roleId  角色id
     * 响应地址： system/role/role-module.jsp
     */
    @RequestMapping("/roleModule")
    public String roleModule(String roleId) {
        log.info("进入角色权限页面.....");

        // 根据角色id查询（页面要显示角色名称）
        Role role = roleService.findById(roleId);
        request.setAttribute("role",role);
        return "system/role/role-module";
    }

    @Autowired
    private ModuleService moduleService;
    /**
     * 角色分配权限（2）role-module.jsp 发送异步请求，返回ztree需要的json格式数据
     * 请求参数： roleId  角色id
     * 返回数据： json格式数据
     * [{ id:2, pId:0, name:"随意勾选 2", checked:true, open:true},{}..]
     */
    @RequestMapping("/getZtreeNode")
    @ResponseBody
    public List<Map<String, Object>> getZtreeNode(String roleId) throws Exception {
        //1. 定义返回结果
        List<Map<String, Object>> results = new ArrayList<>();
        ObjectMapper objectMapper = new ObjectMapper();
        //.查询redis里面存储的类别列表数据返回json字符串数据
        //获取Jedis连接对象
        Jedis jedis = JedisUtils.getJedis();
        //读取缓存数据
        String jsonData = jedis.get("moduleList"+getLoginUser().getId()+roleId);

        //2.判断json字符串是否有数据
        if (jsonData == null) {

            //2. 查询所有的权限
            List<Module> moduleList = moduleService.findAll();

            //3. 查询角色已经拥有的`权限`
            List<Module> roleModuleList = moduleService.findModuleByRoleId(roleId);

            //4. 遍历所有的权限，构造返回结果
            for (Module module : moduleList) {
                //4.1 构造map
                Map<String, Object> map = new HashMap<>();
                //4.2 封装map: { id:2, pId:0, name:"随意勾选 2", checked:true, open:true}
                map.put("id", module.getId());
                map.put("pId", module.getParentId());
                map.put("name", module.getName());
                map.put("open", true);
                // 判断: 如果当前角色已经具有当前遍历的权限，就默认选中
                if (roleModuleList.contains(module)) {//注意：Module实体类要重写equals方法..
                    map.put("checked", true);
                }

                //4.3 添加到集合
                results.add(map);
            }
            //写入缓存
            jsonData = objectMapper.writeValueAsString(results);
            jedis.set("moduleList"+getLoginUser().getId()+roleId, jsonData);
        } else {
            //4.如果json字符串数据有效，将json字符串转换为java对象返回
            //json字符串转换为java对象语法：objectMapper.readValue(json字符串,java类型)
            results = objectMapper.readValue(jsonData, List.class);
        }
        //关闭连接
        jedis.close();
        return results;
    }

    /**
     * 角色分配权限（3）role-module.jsp页面点击保存
     * 请求参数：
     * roleId： 角色id
     * moduleIds: 权限id，多个权限id用逗号隔开
     */
    @RequestMapping("updateRoleModule")
    public String updateRoleModule(String roleId, String moduleIds) {
        //获取Jedis连接对象
        Jedis jedis = JedisUtils.getJedis();
        //读取缓存数据
        jedis.del("moduleList"+getLoginUser().getId()+roleId);
        jedis.close();

        roleService.updateRoleModule(roleId, moduleIds);
        // 角色分配权限成功，跳转到列表
        return "redirect:/system/role/list";
    }
}











